home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / lfsrebuild / diff < prev    next >
Encoding:
Text File  |  1992-03-12  |  13.6 KB  |  494 lines

  1. 17c17
  2. < static char rcsid[] = "$Header: /sprite/src/cmds/fscheck/RCS/checkdir.c,v 1.29 90/10/10 15:29:03 mendel Exp $ SPRITE (Berkeley)";
  3. ---
  4. > static char rcsid[] = "$Header: /sprite/src/cmds/fscheck/RCS/checkdir.c,v 1.30 90/11/01 23:28:33 jhh Exp $ SPRITE (Berkeley)";
  5. 20c20
  6. < #include <option.h>
  7. ---
  8. > #include "option.h"
  9. 22c22
  10. < #include <list.h>
  11. ---
  12. > #include "list.h"
  13. 27c27,28
  14. < static  int         lostFoundFileNum = -1;
  15. ---
  16. > static    int        adding = 0;
  17. > extern    int         writeDisk;
  18. 28a30,43
  19. > static    FdInfo        *descInfoArray;
  20. > static    int    
  21. > lostFoundFileNum = -1;
  22. > extern    int        patchRoot;
  23. > int            outputFileNum = -1;
  24. > int            partFID;
  25. > Ofs_DomainHeader        *domainPtr;
  26. > void            CheckDirEntry();
  27. > static void        CheckDir();
  28. > static ReturnStatus    AddToDirectory();
  29. > Fsdm_FileDescriptor    *rootFDPtr;
  30. > Fsdm_FileDescriptor    *lostFoundFDPtr;
  31. 30,44c45
  32. < int foundError;
  33. < int verbose = 1;
  34. < int debug = 0;
  35. < int tooBig = 0;
  36. < static int        diskFd;
  37. < Fsdm_FileDescriptor    *rootFDPtr, *lostFoundFDPtr;
  38. < static int MakePtrAccessible _ARGS_((register DirIndexInfo *indexInfoPtr));
  39. < static int GetFirstIndex _ARGS_((int blockNum, register DirIndexInfo *indexInfoPtr));
  40. < static int GetNextIndex _ARGS_((register DirIndexInfo *indexInfoPtr));
  41. < static void OpenDir _ARGS_((Fsdm_FileDescriptor *fdPtr, FdInfo *fdInfoPtr, DirIndexInfo *indexInfoPtr, Fslcl_DirEntry **dirEntryPtrPtr));
  42. < static void NextDirEntry _ARGS_((DirIndexInfo *indexInfoPtr, Fslcl_DirEntry **dirEntryPtrPtr));
  43. < static void CloseDir _ARGS_((DirIndexInfo *indexInfoPtr));
  44. < static void CheckDir _ARGS_((int fdNum, Fsdm_FileDescriptor *fdPtr, FdInfo *fdInfoPtr, int parentFdNum, int lostDirNum, int *dirOKPtr));
  45. ---
  46. > extern int verbose;
  47. 70,73c71,75
  48. <     int bufSize,  j;
  49. <     LfsFileDescriptor    *descPtr;
  50. <     char *descBuf;
  51. <     LfsDescMapEntry *descMapPtr;
  52. ---
  53. >     ModListElement    *modElemPtr;
  54. >     RelocListElement    *relocElemPtr;
  55. >     static char        block[FS_BLOCK_SIZE];
  56. >     int            blockNum;
  57. >     int            offset;
  58. 75,83c77
  59. <     if ((fdNum < 0) || (fdNum >= superBlockPtr->descMap.maxDesc)) {
  60. <     return 0;
  61. <     }
  62. <     if (descInfoArray[fdNum].flags & FD_UNREADABLE) {
  63. <     return 0;
  64. <     }
  65. <     bufSize = superBlockPtr->fileLayout.descPerBlock * sizeof(*descPtr);
  66. <     descBuf = alloca(bufSize);
  67. ---
  68. >     descInfoArray[fdNum].flags &= ~FD_MODIFIED;
  69. 85,106c79,80
  70. <     descMapPtr = DescMapEntry(fdNum);
  71. <     if (descMapPtr->flags != LFS_DESC_MAP_ALLOCED) {
  72. <     Alloc(*fdPtrPtr,Fsdm_FileDescriptor,1);
  73. <     if (tooBig) {
  74. <         return 0;
  75. <     }
  76. <     bzero((char *) *fdPtrPtr, sizeof(Fsdm_FileDescriptor));
  77. <     return 1;
  78. <     }
  79. <     if (DiskRead(diskFd, descMapPtr->blockAddress, bufSize, descBuf)
  80. <             != bufSize) {
  81. <     return 0;
  82. <     }
  83. <     descPtr = (LfsFileDescriptor *)descBuf;
  84. <     for (j = 0; j < superBlockPtr->fileLayout.descPerBlock; j++) {
  85. <     if (!(descPtr->common.flags & FSDM_FD_ALLOC)) {
  86. <         break;
  87. <     }
  88. <     if (descPtr->fileNumber == fdNum) {
  89. <         break;
  90. <     }
  91. <     descPtr++;
  92. ---
  93. >     if (descInfoArray[fdNum].flags & FD_UNREADABLE) {
  94. >     return(0);
  95. 108,111c82,107
  96. <     if ((j >= superBlockPtr->fileLayout.descPerBlock) ||
  97. <     !(descPtr->common.flags & FSDM_FD_ALLOC) ||
  98. <     (descPtr->fileNumber != fdNum)) {
  99. <     return 0;
  100. ---
  101. >     if (descInfoArray[fdNum].flags & FD_RELOCATE) {
  102. >     LIST_FORALL(relocList, (List_Links *)relocElemPtr) {
  103. >         if (relocElemPtr->origFdNum == fdNum) {
  104. >         *fdPtrPtr = relocElemPtr->fdPtr;
  105. >         return(1);
  106. >         }
  107. >     }
  108. >     Output(stderr, "FetchFileDesc: FD not found in relocate list.\n");
  109. >     abort();
  110. >     }
  111. >     if (descInfoArray[fdNum].flags & ON_MOD_LIST) {
  112. >     LIST_FORALL(modList, (List_Links *)modElemPtr) {
  113. >         if (modElemPtr->fdNum == fdNum) {
  114. >         *fdPtrPtr = modElemPtr->fdPtr;
  115. >         return(1);
  116. >         }
  117. >     }
  118. >     Output(stderr, "FetchFileDesc: FD not found in mod list.\n");
  119. >     abort();
  120. >     }
  121. >     blockNum = domainPtr->fileDescOffset + fdNum / FSDM_FILE_DESC_PER_BLOCK;
  122. >     offset = (fdNum & (FSDM_FILE_DESC_PER_BLOCK - 1)) * FSDM_MAX_FILE_DESC_SIZE;
  123. >     if (Disk_BlockRead(partFID, domainPtr, blockNum, 1, 
  124. >                (Address) block) < 0) {
  125. >     OutputPerror("FetchFileDesc: Read failed on previously readable block");
  126. >     exit(EXIT_READ_FAILURE);
  127. 117c113
  128. <     bcopy((Address)&(descPtr->common), (Address)*fdPtrPtr, 
  129. ---
  130. >     bcopy((Address)&block[offset], (Address)*fdPtrPtr, 
  131. 143,144c139,167
  132. <     extern void panic();
  133. <     panic("StoreFileDesc not implemented\n");
  134. ---
  135. >     ModListElement    *modElemPtr;
  136. >     if (descInfoArray[fdNum].flags & FD_MODIFIED) {
  137. >     if (descInfoArray[fdNum].flags & ON_MOD_LIST) {
  138. >         LIST_FORALL(modList, (List_Links *)modElemPtr) {
  139. >         if (modElemPtr->fdNum == fdNum) {
  140. >             /*
  141. >              * The old fd may be in use on another list so we can't
  142. >              * free it, but it may become unreferenced. 
  143. >              */
  144. >             modElemPtr->fdPtr = fdPtr;
  145. >             return;
  146. >         }
  147. >         }
  148. >         Output(stderr, "StoreFileDesc: FD not found in list.\n");
  149. >         abort();
  150. >     } else {
  151. >         ModListElement    *modElemPtr;
  152. >         Alloc(modElemPtr,ModListElement,1);
  153. >         if (tooBig) {
  154. >         return;
  155. >         }
  156. >         descInfoArray[fdNum].flags |= ON_MOD_LIST;
  157. >         modElemPtr->fdNum = fdNum;
  158. >         modElemPtr->fdPtr = fdPtr;
  159. >         List_Insert((List_Links *)modElemPtr, LIST_ATREAR(modList));
  160. >     }
  161. >     }
  162. 186,189c209,212
  163. <     if (DiskRead(diskFd,
  164. <               *blockAddrPtr, FS_BLOCK_SIZE,
  165. <               indexInfoPtr->firstBlock) != FS_BLOCK_SIZE) {
  166. <         fprintf(stderr,"MakePtrAccessible: Read (1) failed block %d\n",
  167. ---
  168. >     if (Disk_FragRead(partFID, domainPtr,
  169. >               *blockAddrPtr, FS_FRAGMENTS_PER_BLOCK,
  170. >               indexInfoPtr->firstBlock) < 0) {
  171. >         Output(stderr,"MakePtrAccessible: Read (1) failed block %d\n",
  172. 206,209c229,232
  173. <     if (DiskRead(diskFd, 
  174. <               *blockAddrPtr, FS_BLOCK_SIZE,
  175. <               indexInfoPtr->secondBlock) != FS_BLOCK_SIZE) {
  176. <         fprintf(stderr,"MakePtrAccessible: Read (2) failed block %d\n",
  177. ---
  178. >     if (Disk_FragRead(partFID, domainPtr,
  179. >               *blockAddrPtr, FS_FRAGMENTS_PER_BLOCK,
  180. >               indexInfoPtr->secondBlock) < 0) {
  181. >         Output(stderr,"MakePtrAccessible: Read (2) failed block %d\n",
  182. 406c429
  183. < static void
  184. ---
  185. > void
  186. 425c448
  187. <     fprintf(stderr,
  188. ---
  189. >     Output(stderr,
  190. 438c461
  191. <     fprintf(stderr, "OpenDir: Error setting up index\n");
  192. ---
  193. >     Output(stderr, "OpenDir: Error setting up index\n");
  194. 451,456c474,480
  195. <     if (DiskRead(diskFd, 
  196. <               indexInfoPtr->blockAddr, 
  197. <               fragsToRead*FS_FRAGMENT_SIZE, indexInfoPtr->dirBlock) 
  198. <               != fragsToRead*FS_FRAGMENT_SIZE) {
  199. <     fprintf(stderr, "OpenDir: Read failed block %d\n",
  200. <                indexInfoPtr->blockAddr); 
  201. ---
  202. >     if (Disk_FragRead(partFID, domainPtr,
  203. >               indexInfoPtr->blockAddr + 
  204. >               domainPtr->dataOffset * FS_FRAGMENTS_PER_BLOCK, 
  205. >               fragsToRead, indexInfoPtr->dirBlock) < 0) {
  206. >     Output(stderr, "OpenDir: Read failed block %d\n",
  207. >                indexInfoPtr->blockAddr + 
  208. >                        domainPtr->dataOffset * FS_FRAGMENTS_PER_BLOCK);
  209. 481c505
  210. < static void
  211. ---
  212. > void
  213. 501a526,537
  214. >     if (indexInfoPtr->dirDirty && writeDisk) {
  215. >         if (Disk_FragWrite(partFID, domainPtr,
  216. >                   indexInfoPtr->blockAddr + 
  217. >                   domainPtr->dataOffset * 
  218. >                   FS_FRAGMENTS_PER_BLOCK, 
  219. >                   indexInfoPtr->numFrags, 
  220. >                   indexInfoPtr->dirBlock) < 0) {
  221. >         Output(stderr, "NextDirEntry: Write failed block %d\n",
  222. >                    indexInfoPtr->blockAddr + 
  223. >                     domainPtr->dataOffset * FS_FRAGMENTS_PER_BLOCK);
  224. >         }
  225. >     }
  226. 516d551
  227. < #ifdef notdef
  228. 517a553,561
  229. >         if (Disk_FragWrite(partFID, domainPtr,
  230. >                   indexInfoPtr->blockAddr + 
  231. >                   domainPtr->dataOffset * 
  232. >                   FS_FRAGMENTS_PER_BLOCK, 
  233. >                   indexInfoPtr->numFrags, 
  234. >                   indexInfoPtr->dirBlock) < 0) {
  235. >         Output(stderr, "NextDirEntry: Write (2) failed block %d\n",
  236. >                    indexInfoPtr->blockAddr + 
  237. >                     domainPtr->dataOffset * FS_FRAGMENTS_PER_BLOCK);
  238. 518a563
  239. >         return;
  240. 521d565
  241. < #endif
  242. 523c567
  243. <         fprintf(stderr, "NextDirEntry: Get index failed\n");
  244. ---
  245. >         Output(stderr, "NextDirEntry: Get index failed\n");
  246. 534,538c578,585
  247. <     if (DiskRead(diskFd,   indexInfoPtr->blockAddr,
  248. <               fragsToRead*FS_FRAGMENT_SIZE, 
  249. <               indexInfoPtr->dirBlock) != fragsToRead*FS_FRAGMENT_SIZE) {
  250. <         fprintf(stderr, "NextDirEntry: Read failed block %d\n",
  251. <                 indexInfoPtr->blockAddr); 
  252. ---
  253. >     if (Disk_FragRead(partFID, domainPtr,
  254. >               indexInfoPtr->blockAddr + 
  255. >               domainPtr->dataOffset * 
  256. >               FS_FRAGMENTS_PER_BLOCK, 
  257. >               fragsToRead, indexInfoPtr->dirBlock) < 0) {
  258. >         Output(stderr, "NextDirEntry: Read failed block %d\n",
  259. >                 indexInfoPtr->blockAddr + 
  260. >                 domainPtr->dataOffset * FS_FRAGMENTS_PER_BLOCK);
  261. 551a599,600
  262. > static    DirIndexInfo    rootDirIndex;
  263. > static  Fslcl_DirEntry    *rootDirEntryPtr;
  264. 580d628
  265. < #ifdef notdef
  266. 581a630,638
  267. >     if (Disk_FragWrite(partFID, domainPtr,
  268. >               indexInfoPtr->blockAddr + 
  269. >               domainPtr->dataOffset * 
  270. >               FS_FRAGMENTS_PER_BLOCK, 
  271. >               indexInfoPtr->numFrags, 
  272. >               indexInfoPtr->dirBlock) < 0) {
  273. >         Output(stderr, "CloseDir: Write (2) failed block %d\n",
  274. >                indexInfoPtr->blockAddr + 
  275. >                 domainPtr->dataOffset * FS_FRAGMENTS_PER_BLOCK);
  276. 582a640
  277. >     }
  278. 584d641
  279. < #endif
  280. 605,606c662,667
  281. < CheckDirTree(diskId)
  282. <     int            diskId;
  283. ---
  284. > CheckDirTree(partFIDParm, domainParmPtr, descInfoParm,fdBitmapPtr, bitmapPtr)
  285. >     int            partFIDParm;
  286. >     Ofs_DomainHeader    *domainParmPtr;
  287. >     FdInfo        *descInfoParm;
  288. >     u_char        *fdBitmapPtr;
  289. >     u_char        *bitmapPtr;
  290. 615a677,679
  291. >     char        newFileName[100];
  292. >     int            offset;
  293. >     int            outputFileLength;
  294. 617a682,684
  295. >     partFID = partFIDParm;
  296. >     domainPtr = domainParmPtr;
  297. >     descInfoArray = descInfoParm;
  298. 619d685
  299. <     diskFd = diskId;
  300. 624c690
  301. <     fprintf(stderr, "Unable to fetch file descriptor for root");
  302. ---
  303. >     Output(stderr, "Unable to fetch file descriptor for root");
  304. 631a698
  305. >     char *fileName;
  306. 633c700
  307. <     fprintf(stderr, "Root directory corrupted\n");
  308. ---
  309. >     Output(stderr, "Root directory corrupted\n");
  310. 636a704,709
  311. >     /*
  312. >      * On 5/10/88 the root of a disk (/sprite) was overwritten.  It was
  313. >      * patched by looking for directories with a ".." entry that
  314. >      * referenced root, fileNumber == 2, and putting them into the
  315. >      * root just like other orphans are put into lost+found.
  316. >      */
  317. 694a768,770
  318. >     if (outputFileName != NULL) {
  319. >     outputFileLength = strlen(outputFileName);
  320. >     }
  321. 703a780,784
  322. >     } else if (rawOutput && outputFileName != NULL &&
  323. >         (dirEntryPtr->nameLength == outputFileLength) && 
  324. >         strncmp(outputFileName, dirEntryPtr->fileName, outputFileLength)
  325. >         == 0) {
  326. >         outputFileNum = dirEntryPtr->fileNumber;
  327. 714c795
  328. <     fprintf(stderr, "lost+found missing from root\n");
  329. ---
  330. >     Output(stderr, "lost+found missing from root\n");
  331. 721c802
  332. <         fprintf(stderr, "Unable to fetch file descriptor for lost+found");
  333. ---
  334. >         Output(stderr, "Unable to fetch file descriptor for lost+found");
  335. 728c809
  336. <         fprintf(stderr,
  337. ---
  338. >         Output(stderr,
  339. 740c821
  340. <             fprintf(stderr, "Could not open lost+found\n");
  341. ---
  342. >             Output(stderr, "Could not open lost+found\n");
  343. 750d830
  344. 753a834
  345. 759c840
  346. <      i < superBlockPtr->descMap.maxDesc; 
  347. ---
  348. >      i < domainPtr->numFileDesc; 
  349. 771c852
  350. <         fprintf(stderr,
  351. ---
  352. >         Output(stderr,
  353. 778a860
  354. 832c914
  355. <      i < superBlockPtr->descMap.maxDesc; 
  356. ---
  357. >      i <= domainPtr->numFileDesc; 
  358. 839d920
  359. 842c923
  360. <     } else if (i == superBlockPtr->descMap.maxDesc-1) {
  361. ---
  362. >     } else if (i == domainPtr->numFileDesc) {
  363. 857c938
  364. <         fprintf(stderr, "File %d is unreferenced\n", i);
  365. ---
  366. >         Output(stderr, "File %d is unreferenced\n", i);
  367. 864d944
  368. 869c949
  369. <             fprintf(stderr, 
  370. ---
  371. >             Output(stderr, 
  372. 878c958
  373. <         fprintf(stderr,
  374. ---
  375. >         Output(stderr,
  376. 894c974
  377. <             fprintf(stderr,
  378. ---
  379. >             Output(stderr,
  380. 908c988
  381. <     fprintf(stderr, "%d files not added to directory %d.\n", notAdded,
  382. ---
  383. >     Output(stderr, "%d files not added to directory %d.\n", notAdded,
  384. 913c993
  385. <     fprintf(stderr, "%d unreferenced files\n", unrefFiles);
  386. ---
  387. >     Output(stderr, "%d unreferenced files\n", unrefFiles);
  388. 916c996
  389. <     fprintf(stderr, "%d links counts corrected\n",
  390. ---
  391. >     Output(stderr, "%d links counts corrected\n",
  392. 920d999
  393. < #ifdef notdef
  394. 931d1009
  395. < #endif
  396. 965d1042
  397. <                      */
  398. 988c1065
  399. <     fprintf(stderr, "Empty directory %d %s changed to a file.\n",
  400. ---
  401. >     Output(stderr, "Empty directory %d %s changed to a file.\n",
  402. 1000c1077
  403. <     fprintf(stderr,"Working on %s\n",pathName);
  404. ---
  405. >     Output(stderr,"Working on %s\n",pathName);
  406. 1012c1089
  407. <         fprintf(stderr,
  408. ---
  409. >         Output(stderr,
  410. 1022c1099
  411. <         fprintf(stderr, 
  412. ---
  413. >         Output(stderr, 
  414. 1037c1114
  415. <         fprintf(stderr,
  416. ---
  417. >         Output(stderr,
  418. 1047c1124
  419. <         fprintf(stderr, 
  420. ---
  421. >         Output(stderr, 
  422. 1065c1142
  423. <             fprintf(stderr, "Found #%d, an orphan of dir #%d\n", 
  424. ---
  425. >             Output(stderr, "Found #%d, an orphan of dir #%d\n", 
  426. 1091c1168
  427. <             fprintf(stderr,
  428. ---
  429. >             Output(stderr,
  430. 1158c1235
  431. <     fprintf(stderr,
  432. ---
  433. >     Output(stderr,
  434. 1182c1259
  435. <         fprintf(stderr,
  436. ---
  437. >         Output(stderr,
  438. 1204c1281
  439. <         fprintf(stderr,
  440. ---
  441. >         Output(stderr,
  442. 1216,1217c1293,1294
  443. <         dirEntryPtr->fileNumber >= superBlockPtr->descMap.maxDesc) {
  444. <     fprintf(stderr, 
  445. ---
  446. >         dirEntryPtr->fileNumber >= domainPtr->numFileDesc) {
  447. >     Output(stderr, 
  448. 1233c1310
  449. <     fprintf(stderr, 
  450. ---
  451. >     Output(stderr, 
  452. 1242c1319
  453. <     fprintf(stderr,"Entry %s ok.\n",dirEntryPtr->fileName);
  454. ---
  455. >     Output(stderr,"Entry %s ok.\n",dirEntryPtr->fileName);
  456. 1245c1322
  457. <     fprintf(stderr,
  458. ---
  459. >     Output(stderr,
  460. 1251d1327
  461. < #ifdef notdef
  462. 1284c1360
  463. <     fprintf(stderr, "SetDotDot: Could not open dir\n");
  464. ---
  465. >     Output(stderr, "SetDotDot: Could not open dir\n");
  466. 1293c1369
  467. <     fprintf(stderr, "SetDotDot: Could not move from . to ..\n");
  468. ---
  469. >     Output(stderr, "SetDotDot: Could not move from . to ..\n");
  470. 1304c1380
  471. <         fprintf(stderr, "SetDotDot: Write failed block %d\n",
  472. ---
  473. >         Output(stderr, "SetDotDot: Write failed block %d\n",
  474. 1311a1388
  475. 1371c1448
  476. <         fprintf(stderr,
  477. ---
  478. >         Output(stderr,
  479. 1474d1550
  480. < #endif
  481.